package com.chenyue.cm.match.service;

import com.chenyue.cm.base.service.BaseServiceIface;
import com.chenyue.cm.bean.Success;
import com.chenyue.cm.common.vo.Page;
import com.chenyue.cm.match.domain.*;
import com.chenyue.cm.match.vo.*;
import com.chenyue.cm.match.vo.param.ThirdSetLiveRoom;

import java.util.List;

/**
 * @author chenyue-cm
 */
public interface JdMatchService extends BaseServiceIface<JdMatch> {

    /**
     * 用户报名赛事地址校验
     *
     * @param matchId 赛事id
     * @param address 地址信息
     * @return 错误信息
     */
    String checkAddress(Integer matchId, Address address);

    /**
     * 按条件查询赛事
     *
     * @param page       当前页
     * @param rows       条数
     * @param type       赛事分类（分类表id）
     * @param matchGroup 参赛范围（1单人/2团体）
     * @param matchType  参赛类型（1单人单项/2单人多项/3多人多项）
     * @param city       当前城市code
     * @param province   当前省会code
     * @return list
     */
    Page<List<MatchInfo>> getAllMatch(Integer page, Integer rows, Integer type, Integer matchGroup, Integer matchType, String keyWords, String city, String province);

    /**
     * 获取三方机构发布的赛事列表
     *
     * @param page   当前页
     * @param rows   条数
     * @param state  审核状态 0待审核1通过2拒绝
     * @param userId 三方机构id
     * @return 三方机构发布的赛事列表
     */
    Page<List<MatchInfo>> getMatchByUser(Integer page, Integer rows, Integer state, Integer userId, Integer promotionType);

    /**
     * 个人报名
     *
     * @param mobile     手机号
     * @param matchId    赛事id
     * @param checkState 公开赛 1 else 0
     * @param payType    支付状态 0 免费
     */
    void personSign(String mobile, Integer matchId, Integer checkState, Integer payType);

    /**
     * 团队报名
     *
     * @param groupSignIn 团队报名 入参
     * @param matchId     赛事id
     * @param checkState  公开赛 1 else 0
     * @param payType     支付状态 0 免费
     */
    void teamSign(GroupSignIn groupSignIn, Integer matchId, Integer checkState, Integer payType);

    /**
     * 临时组队队伍详情
     *
     * @param matchId 赛事id
     * @return 临时组队队伍详情
     */
    Page<List<TemporaryTeam>> temporaryTeam(Integer page, Integer rows, Integer matchId);

    /**
     * 临时组队队伍详情
     *
     * @param matchId 赛事id
     * @param userId  用户id
     * @return 临时组队队伍详情
     */
    TemporaryTeam temporaryTeamByUser(Integer matchId, Integer userId);

    /**
     * 检验用户能否发布临时组队
     *
     * @param userId  用户id
     * @param matchId 赛事id
     * @return 检验
     */
    String checkUserCreate(Integer userId, Integer matchId);

    /**
     * 检验用户能否报名
     *
     * @param userId  用户id
     * @param matchId 赛事id
     * @return 检验
     */
    String checkUserSign(Integer userId, Integer matchId);

    /**
     * 用户发起临时组队
     *
     * @param matchGroup matchGroup
     */
    void createTeam(JdMatchGroup matchGroup);

    /**
     * 加入临时组队
     *
     * @param userId  用户id
     * @param teamId  队伍id
     * @param matchId 赛事id
     * @return 成功/失败
     */
    Success<String> joinTeam(Integer userId, Integer teamId, Integer matchId);

    /**
     * 删除队伍成员
     *
     * @param teamId 队伍id
     * @param userId 队员用户id
     */
    void deleteTeamSignUser(Integer teamId, Integer userId);

    /**
     * 单个赛事详情
     *
     * @param matchId       赛事id
     * @param promotionType 0自动1手动
     * @return MatchInfo
     */
    MatchInfo matchInfo(Integer matchId, Integer promotionType);

    /**
     * 单个赛事报名人列表
     *
     * @param matchId    赛事id
     * @param checkState 审核状态
     * @param payState   支付状态
     * @return 报名人
     */
    List<MatchSignUserInfo> signUserList(Integer matchId, Integer checkState, Integer payState);

    /**
     * 三方机构报名审核
     *
     * @param signId 报名id
     * @param state  审核状态
     */
    void signCheck(Integer signId, Integer state);

    /**
     * 晋级到下一个赛程
     *
     * @param state   1晋级2淘汰
     * @param matchId 赛事id
     * @param userId  用户id
     * @param groupId 团队id
     */
    void enterNextFormat(Integer state, Integer matchId, Integer userId, Integer groupId);

    /**
     * 三方机构报名审核
     *
     * @param match  赛事信息
     * @param userId 审核人
     */
    void thirdCreateMatch(ThirdCreateMatch match, Integer userId);

    /**
     * 三方机构设置直播间
     *
     * @param matchId      赛事id
     * @param liveUserList 直播间信息
     * @param formatId     赛程id
     */
    void setLiveRoom(Integer matchId, List<FormatLiveRecord> liveUserList, Integer formatId);

    /**
     * 获取直播间
     *
     * @param formatId 赛程id
     * @return ThirdSetLiveRoom
     */
    ThirdSetLiveRoom getLiveRoom(Integer formatId);

    /**
     * 根据用户赛事查找团队
     *
     * @param matchId 赛事id
     * @param userId  用户id
     * @return 团队信息
     */
    ViewMatchGroupUser getGroupByUser(Integer matchId, Integer userId);
}